#pragma once

#include "subtasks/task_base.h"
#include "kernel/task/task_config_dto.h"
#include "kernel/interfaces/ILogger.h"
#include "kernel/interfaces/Result.h"
#include "application/vehicle/vehicle_service.h"
#include "application/dispatcher/dispatcher_service.h"
#include "application/map/map_application_service.h"
#include <memory>
#include <vector>

namespace application {
namespace task {

/**
 * @brief 任务模板工厂
 * @details application层：根据配置DTO创建可执行的子任务序列
 *          对应三方代码中从配置创建TaskChain的逻辑
 *
 *          参考：task_manager.cpp:270-310
 */
class TaskTemplateFactory {
public:
    explicit TaskTemplateFactory(
        std::shared_ptr<vehicle::VehicleService> vehicleService,
        std::shared_ptr<dispatcher::DispatcherService> dispatcherService,
        std::shared_ptr<MapApplicationService> mapService,
        std::shared_ptr<kernel::ILogger> logger = nullptr
    );

    /**
     * @brief 根据模板配置创建子任务列表
     * @param templateConfig 模板配置DTO
     * @param agvNumber 执行任务的AGV编号
     * @return 子任务列表（失败时返回空vector）
     */
    std::vector<std::unique_ptr<SubTaskBase>> createSubTasks(
        const kernel::task::TaskTemplateConfigDTO& templateConfig,
        int agvNumber
    );

    /**
     * @brief 根据单个子任务配置创建子任务
     * @param subTaskConfig 子任务配置DTO
     * @param agvNumber 执行任务的AGV编号
     * @return 子任务指针（失败时返回nullptr）
     */
    std::unique_ptr<SubTaskBase> createSubTask(
        const kernel::task::SubTaskConfigDTO& subTaskConfig,
        int agvNumber
    );

private:
    std::shared_ptr<vehicle::VehicleService> m_vehicleService;
    std::shared_ptr<dispatcher::DispatcherService> m_dispatcherService;
    std::shared_ptr<MapApplicationService> m_mapService;
    std::shared_ptr<kernel::ILogger> m_logger;

    // ==================== 子任务创建方法 ====================

    /**
     * @brief 创建Move子任务
     * @return 子任务指针（失败时返回nullptr）
     */
    std::unique_ptr<SubTaskBase> createMoveTask(
        const kernel::task::SubTaskConfigDTO& config,
        int agvNumber
    );

    /**
     * @brief 创建Jack子任务
     * @return 子任务指针（失败时返回nullptr）
     */
    std::unique_ptr<SubTaskBase> createJackTask(
        const kernel::task::SubTaskConfigDTO& config,
        int agvNumber
    );

    /**
     * @brief 创建Lift子任务
     * @return 子任务指针（失败时返回nullptr）
     */
    std::unique_ptr<SubTaskBase> createLiftTask(
        const kernel::task::SubTaskConfigDTO& config,
        int agvNumber
    );

    /**
     * @brief 创建Charge子任务
     * @return 子任务指针（失败时返回nullptr）
     */
    std::unique_ptr<SubTaskBase> createChargeTask(
        const kernel::task::SubTaskConfigDTO& config,
        int agvNumber
    );

    /**
     * @brief 创建Park子任务
     * @return 子任务指针（失败时返回nullptr）
     */
    std::unique_ptr<SubTaskBase> createParkTask(
        const kernel::task::SubTaskConfigDTO& config,
        int agvNumber
    );
};

} // namespace task
} // namespace application
